<?php
    //1.定义命名空间与本文件所在目录层级相同（app\home\controller）
    //2.因为composer自动载入类的需要
    //3.命名空间namespace之前不能有输出！
    namespace app\admin\controller;

    //1.引入框架核心目录中的Controller类
    //2.用于执行操作后的跳转页面及显示消息提示
    use houdunwang\core\Controller;

    //1.引入框架核心目录中的View类
    //2.用于载入模板文件及向模板文件传递数据
    use houdunwang\view\View;
    use system\model\User as UserModel;

    //1.引入验证码类
    //2.登录页面显示验证图
    use Gregwar\Captcha\CaptchaBuilder;
    use Gregwar\Captcha\PhraseBuilder;

    //1.定义User类
    //2.用于用户的登录、显示验证码、
    //修改密码、退出操作
    //3.继承Controller类在执行完相关操作的跳转及消息提示
    class User extends Controller{

        //1.定义登录的方法
        //2.载入模板文件、判断验证码输入是否正确、
        //判断用户名是否存在、判断密码输入是否正确
        //3.都正确的话则跳转登录成功跳转到后台主页
        public function login(){

            if(IS_POST){
                //判断验证码是否输入正确与否
                if(strtolower($_POST["captcha"])!=$_SESSION["captcha"]){
                    $this->message("验证码错误");
                }

                //上述验证码输入正确的话执行下述操作
                //1.调取用户所输入的用户名的数据
                //2如果数据为空（即User表中不存在该用户名）则消息提示及
                //重新登录
                //不能写成where("'username'='{$_POST['username']}'") 因为字段是username而不是'username'
                $userData = UserModel::where("username='{$_POST['username']}'")->get();
                if(!$userData){
                    $this->message("用户名不存在");
                }

                //上述验证码及用户名正确的话执行下述操作
                //1.对用户输入的密码进行md5加密（加上后缀"student"增强安全性）
                //2.如果所输入的密码（md5加密后）与表中的密码不能匹配（md5加密后的）
                //则消息提示及跳转重新登录
                $pwd = md5($_POST["password"]."student");
                if($pwd!=$userData[0]["password"]){
                    $this->message("密码输入错误");
                }

                //上述验证码正确、用户名存在且密码输入正确则执行下述操作
                //1.判断用户是否点选了“记住我”选项框
                //2.选的话则将session保留7天（免登录）
                //否则只保留在会话执行期间（解决退出后再登录而不选“记住我”时又变成保留7天的问题）
                if(isset($_POST["autologin"])){
                    setcookie(session_name(),session_id(),time()+3600*24*7,"/");
                }else{
                    setcookie(session_name(),session_id(),0,"/");
                }

                //1.将用户账号的uid及username值写入到session当中
                //2.用于其它页面判断是否已经登录过了
                $_SESSION["user"] = [
                    "uid"=>$userData[0]["uid"],
                    "username"=>$userData[0]["username"]
                ];

                //都输入正确且执行完写入session后进行跳转到后台主页
                $this->setRedirect(u("entry/index"))->message("登录成功");

            }
            //1.载入模板文件
            //2.显示输入用户名、密码及验证码的表单
            return View::make();
        }

        //1.定义用户退出的方法
        //2.将session变量及文件清除
        //3.跳转到前台首页（页面判断不存在session信息则显示登录链接）
        public function logout(){
            session_unset();
            session_destroy();
            $this->setRedirect(u("home/entry/index"))->message("退出成功");
        }

        //定义修改密码的方法
        public function changepassword(){
            //1.判断是否登录了，如果没有登录则先登录才能修改密码
            //2.避免没有登录就进来操作
            new Common();

            if(IS_POST){

                //1.判断两次密码（新的密码与确认的密码）是否输入一致
                //2.如果不一致则没必要查询数据库，且两次不一致也没法确认要修改成哪个密码
                if($_POST["new-password"]!=$_POST["confirm-password"]){
                    $this->message("新密码与确认密码输入不一致！");
                }

                //1.判断输入的旧密码是否正确
                //2.查询表中对应的用户名的数据获取对应的加密密码用于比对用
                $username = $_SESSION["user"]["username"];
                $userData = UserModel::where("username='{$username}'")->get();
                $dbPassword = $userData[0]["password"];
                //将用户输入的密码md5加密（加上后缀student）
                $oldPasword = md5($_POST["old-password"]."student");
                //1.比对用户输入的密码（加密后）与数据表中的密码（加密的）是否一致
                //2.不一致则消息提示并返回重新登录
                if($dbPassword!=$oldPasword){
                    $this->message("当前密码输入错误");
                }

                //1.如果两次密码（新密码与确认密码输入一致，且旧密码输入正确则进行修改操作）
                //2.获取session当中的当前登录用户的uid值用于修改数据表user时需要用的限制条件
                //3.将用户输入的密码加上后缀student（增加安全性）后进行md5加密
                //4.将表中对应的uid值的用户的密码修改成用户所修改的值
                $pri = $_SESSION["user"]["uid"];
                $confirmPassword = md5($_POST["confirm-password"]."student");
                UserModel::update($pri,"password='{$confirmPassword}'");//密码是字符串要加上引号

                //修改密码完成后清除session让用户重新登录
                session_unset();
                session_destroy();
                $this->setRedirect(u("home/entry/index"))->message("密码修改成功，请重新登录");
            }
            //1.载入模板文件
            //2.用于用户输入密码的表单页面
            return View::make();
        }


        //1.第三方库：显示验证码的方法
        //2.在登录页面调用该方法显示验证码图片
        public function captcha(){
            header( 'Content-type: image/jpeg' );
            //调用helper中的v函数指定验证码的字段
            $phraseBuilder = new PhraseBuilder( v( 'captcha.captcha_len' ) );
            $builder       = new CaptchaBuilder( null, $phraseBuilder );
            $builder->build();
            //把验证码存入session
            $_SESSION['captcha'] = strtolower( $builder->getPhrase() );
            $builder->output();
        }

    }